/**
 * 闭包
 * 含义闭包就是一个环境，闭包就是能够读取其他函数内部变量的函数
 * 在本质上，闭包是将函数内部和函数外部连接起来的桥梁。
 * 作用是保护闭包里的数据，除非开放接口让其访问
 * const能保护变量，但是它无法计算刚开始就修改变量
 * 
 * 作用：
 * 一个是前面提到的可以读取函数内部的变量，另一个就是让这些变量的值始终保持在内存中
 */
var test = foo();
//console.log(test);

//add就是个闭包，a会一直保存在内存中
function foo() {
  var a = 1;
  function add() {
    a++;
    return a;
  }
  return add();
}




console.log(a());
function a() {
  var arr = [Math.random(), Math.random(), Math.random(), Math.random()];
  var square = function (x) {
    return x * x;
  };
  var funcs = makeClosures(arr, square);
  var result = true;
  for (var i = 0; i < arr.length; i++) {
      console.log(funcs[i]());
    result = result && funcs[i]() === square(arr[i]);
  }
  return result;
}


function makeClosures(arr, fn) {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    let a = ()=>{return fn(arr[i])};
    result.push(a);
  }
  console.log(result);
  return result;
}


//区别
// a=fn();
// a=function(){return fn();}